iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0

Collection 裡的元素一放多了,就免不了要在裡面找東西。跟過濾一樣,搜尋也是很常見的的需求,在這個章節裡就要跟大家討論一下 Collection 的搜尋功能。

找出第一個符合條件的元素

find() 可以幫我們找出 Collection 裡第一個符合條件的元素,假如沒有任何元素符合的話,就會回傳 null。咦?是不是覺得跟 filter() 功能很像?其實不然,我們用 IntelliJ IDEA 把回傳 Type 顯示出來就可以知道差異。find() 回傳的是 T?,也就是只有一個元素,找不到就是 null;而 filter() 回傳的是 List<T>,也就是多個元素,沒有符合的話就是空 List。記得要依照不同的情境,選擇合適的 method。

val words = listOf("Lets", "find", "something", "in", "collection", "somehow")

val firstSome = words.find { it.startsWith("some") } // something
val filterSome = words.filter { it.startsWith("s") } // [something, somehow]

找出最後一個符合條件的元素

find() 動作相同但方向相反,findLast() 則是從 Collection 的後面開始往前搜尋找出第一個符合條件的元素,假如沒有任何元素符合的話,就會回傳 null。

val words = listOf("Lets", "find", "something", "in", "collection", "somehow")

val last = words.findLast { it.startsWith("some") }  // somehow

找出元素的 index

find 開頭的搜尋 method 不同,以 index 開頭的幾個搜尋 method 在搜尋後是回傳元素所在的 index,在不同情境下可以使用。indexOf() 會回傳第一個符合搜尋元素的 index;indexOfFirst()indexOfLast() 則是可以傳入一個 Lambda 當條件,從 Collection 的前面或後面開始搜尋,並回傳第一個符合條件的 index。這三個 method 若是搜尋不到結果的話,都會回傳 -1。

val words = arrayOf("Lets", "find", "something", "in", "collection", "somehow")

val index = words.indexOf("some") // -1
val indexOfFirst = words.indexOfFirst { it.contains("some") } // 2
val indexOfLast = words.indexOfLast { it.contains("some") } // 5

表格整理

這個章節討論幾個常用的檢查操作,這些 method 可以省下許多手動處理的動作。同樣地,為了一覽這些 API 在不同 Collection 上的行為,以下用表格來整理本章所討論到的 method:

行為 Array List Set Map
find{} 從頭搜尋元素 v v v x
findLast{} 從尾搜尋元素 v v v x
indexOf() 搜尋元素後回傳 index v v v x
indexOfFist{} 從頭搜尋元素後回傳 index v v v x
indexOfLast{} 從尾搜尋元素後回傳 index v v v x

參考資料


上一篇
第十六天:Collection 操作之檢查
下一篇
第十八天:Collection 操作之群組
系列文
新手也能懂的 Kotlin Collection 賞玩門道31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
tayu
iT邦新手 5 級 ‧ 2022-10-22 23:52:08

val filterSome = words.filter { it.startsWith("x") } // [something, somehow]
似乎是 it.startsWith("s")

聖佑 iT邦新手 4 級 ‧ 2022-10-24 13:51:20 檢舉

Hi 對,當時筆誤,已修正,感謝提醒!

更完整的說明及範例可以參考我後來重新撰寫的《Kotlin Collection 全方位解析攻略 》 https://www.tenlong.com.tw/products/9786263331136

我要留言

立即登入留言